<?php
/**
 * @version : 1.0
 * @since June-2008
 * @package : lib
 * @subpackage struct
 * @name :  CImage
 * @todo:  Lớp  cơ sở CImage. Thao tác với Image
*/
class CImage
{
	/**
	 * Enter description here...
	 *
	 * @var unknown_type
	 */
	public $image;
	public $gd_image;
	static $init_asido = false;
	function __construct($file_name)
	{
		try
		{
			if(!CImage::$init_asido)
			{
				require_once '3rdparty/Asido/class.asido.php';
				if (extension_loaded('imagick')){
					asido::driver('imagick_ext');
				}else {
					asido::driver('gd');
				}
			}
			CImage::$init_asido = true;
			$this->image = Asido::image($file_name);
		}
		catch(Exception $e)
		{
		}
	}
	/**
	 * hàm resize
	 *
	 * @param  $width chiều rộng của ảnh
	 * @param  $height chiều cao của ảnh
	 * @return $this trả về kích cỡ ảnh sau khi thay đổi kích cỡ ảnh
	 */
	function &resize($width, $height)
	{
		Asido::resize($this->image, $width, $height, ASIDO_RESIZE_STRETCH);
		return $this;
	}
	/**
	 * Hàm width
	 *
	 * @param $width chiều rộng của anh, thay đổi chiều rộng của ảnh
	 * @return $this trả về kích thước chiều rộng của anh sau khi thay đổi
	 */
	function &width($width)
	{
		Asido::width($this->image, $width);
		return $this;
	}
	/**
	 * Hàm height
	 * 
	 * @param  $height chiều cao của ảnh
	 * @return $this trả về chiều cao của ảnh sau khi thay đổi
	 */
	function &height($height)
	{
		Asido::height($this->image, $height);
		return $this;
	}
	/**
	 * Hàm fit
	 *
	 * @param  $width chiều rộng ảnh
	 * @param  $height chiều cao
	 * @return $this trả về kích thước (chiều rộng, chiều cao) phù hợp của ảnh
	 */
	function &fit($width, $height)
	{
		Asido::Fit($this->image, $width, $height);
		return $this;
	}
	/**
	 * Hàm frame
	 *
	 * @param  $color màu của ảnh
	 * @return $this trả về kích thước(width, height) và color của anh
	 */
	function &frame($width, $height, $color = null)
	{
		Asido::Frame($this->image, $width, $height, $color);
		return $this;
	}
	function watermark($file_name, $position = ASIDO_WATERMARK_BOTTOM_RIGHT, $scalable = ASIDO_WATERMARK_SCALABLE_ENABLED, $scalable_factor = ASIDO_WATERMARK_SCALABLE_FACTOR)
	{
		Asido::watermark($this->image, $file_name, $position, $scalable, $scalable_factor);
		return $this;
	}
	/**
	 * Hàm open
	 *
	 * @param  $image_url lưu giữ đường link tới các file ảnh
	 * @return hiển thị ảnh tuỳ vào định dạng đuôi của mỗi ảnh
	 */
	static function open($image_url)
	{
		if(!($image = @imagecreatefromgif($image_url)))
		{
			if(!($image = @imagecreatefromjpeg($image_url)))
			{
				if(!($image = @imagecreatefrompng($image_url)))
				{
					if(!($image = @imagecreatefromwbmp($image_url)))
					{
						return false;
					}
				}
			}
		}
		return $image;
	}
	/**
	 * Hàm text
	 *
	 * @param  string $text chuỗi các ký tự mô tả về ảnh
	 * @param  $options là đối tượng lưu trữ một mảng các đối tượng mô tả về ảnh
	 * @return đoạn text
	 */
	function &text($text, $options)
	{
		$options = array_merge(
			array(
				'color' => 0,
				'angle' => 0,
				'size' => 12,
				'font' => 'lib/image/arial.ttf',
				'align' => 'center',
				'valign' => 'middle',
				'padding-left' => 0,
				'padding-right' => 0,
				'padding-top' => 0,
				'padding-bottom' => 0,
			), $options
		);
		
		$this->gd_image = CImage::open($this->image->soure);
		$size = imagettfbbox($options['size'], $options['angle'], $options['font'], $text);
		$text_width = $size[4] - $size[0];
		$text_height = $size[5] - $size[1];
		$width = imagesx($this->gd_image);
		$height = imagesy($this->gd_image);
		$top = 0;
		$left = 0;
		switch($align)
		{
		case 'center':
			$left = ($width - $text_width)/2;
			break;
		case 'left':
			$left = 0;
			break;
		case 'right':
			$left = $width - $text_width;
			break;
		}
		switch($valign)
		{
		case 'middle':
			$top = ($height - $text_height)/2;
			break;
		case 'top':
			$top = 0;
			break;
		case 'bottom':
			$top = $height - $text_height;
			break;
		}
		$left += $options['padding-left'] - $options['padding-right'];
		$top += $options['padding-top'] - $options['padding-bottom'];
		imagettftext($this->gd_image, $options['size'], $options['angle'], $top, $left, $options['color'], $options['font'], $text);
		return $this;
	}
	function &save($file_name)
	{
		try
		{
			if($this->gd_image)
			{
				imagejpeg($this->gd_image, $file_name);
			}
			else
			{
				$this->image->target($file_name);
				$this->image->save(ASIDO_OVERWRITE_ENABLED);
			}
		}
		catch(Exception $e)
		{
		}
		return $this;
	}
	
	static function check_image($file_name){
		try {
			$size = @getimagesize($file_name);
			if (!is_array($size)) {
			        throw new Exception('Image Formatting Invalid');
			        return false;
			}
			return true;
		}catch (Exception $e) {
    			return false;
		}
	}
}
?>